package cn.tedu.order.tcc;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/**
 * 按照Seata的规则,实现TccAction接口
 * 1.添加@LocalTCC注解
 * 2.添加三个方法--TCC方法
 * 3.第一个方法上,添加"两阶段业务操作"注解,
 * 并指定后面两个方法的方法名
 * 4. 三个方法上添加RequestContext参数,
 * 用来从第一个阶段向第二个阶段传递参数
 * 5. 传递的参数数据,用@BusinessActionContextParameter
 * 注解放入上下文对象
 */
@LocalTCC
public interface OrderTccAction {
    /**
     * 避开seata的bug,订单数据一个一个单独传递,而不用封装的
     * @param ctx
     * @return
     */
    @TwoPhaseBusinessAction(name = "OrderTccAction")
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId") Long orderId,//orderId放入上下文对象
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);
    boolean commit(BusinessActionContext ctx);//如果不是默认名字需要在注解中进行配置
    boolean rollback(BusinessActionContext ctx);
}
